/*
 * Copyright (c) 2009.
 */

package kz.home.db;

import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.rms.InvalidRecordIDException;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import java.io.PrintStream;

/**
 * Тест
 * Created by IntelliJ IDEA.
 * User: danik
 * Date: 12.07.2009
 * Time: 0:20:04
 */
public class TestStore extends MIDlet {
    static final String DBNAME = "mydata";

    public TestStore() {
        RecordStore rs;
        // Поскольку данные сохраняются между запусками.
        // MIDlet-ов, первым делом очистим старую record store...

        try {
            RecordStore.deleteRecordStore(DBNAME);
        }
        catch (Exception e) {
            // ignore any errors...
        }

        // Теперь создадим новую и выведем каждый элемент

        try {
            rs = RecordStore.openRecordStore(DBNAME, true);

            byte[] data1 = "Это первая запись".getBytes();
            //byte[] data2 = "Это вторая".getBytes();
            byte[] data2 = "Just only test".getBytes();
            byte[] data3 = "the third record".getBytes();

            data3[0] = 0;
            data3[data3.length - 1] = (byte) -1;

            System.out.println("id1[" + rs.addRecord(data1, 0, data1.length) + "]");
            System.out.println("id2[" + rs.addRecord(data2, 0, data2.length) + "]");
            System.out.println("id3[" + rs.addRecord(data3, 0, data3.length) + "]");

            dumpRecordStore(rs, System.out);

            rs.closeRecordStore();
        }
        catch (RecordStoreException e) {
            System.out.println(e);
        }

        notifyDestroyed();
    }

    public void dumpRecordStore(RecordStore rs, PrintStream out) {
        if (rs == null) return;

        StringBuffer hexLine = new StringBuffer();
        StringBuffer charLine = new StringBuffer();

        try {
            int lastID = rs.getNextRecordID();
            System.out.println("lastID[" + lastID + "]");

            byte[] data = new byte[100]; int size;

            for (int i = 1; i < lastID; ++i) {
                try {
                    size = rs.getRecordSize(i);
                    if (size > data.length) data = new byte[size * 2];

                    out.println("Запись " + i + " размером " + size);

                    rs.getRecord(i, data, 0);
                    dumpRecord(data, size, out, hexLine, charLine, 16);

                    out.println("");
                } catch (InvalidRecordIDException e) {
                    continue;
                }
            }
        }
        catch (RecordStoreException e) {
            out.println("Ошибка при чтении record store: " + e);
        }
    }

    private void dumpRecord( byte[] data, int size, PrintStream out, StringBuffer hexLine, StringBuffer charLine, int maxLen ) {
        if( size == 0 ) return;

        hexLine.setLength( 0 );
        charLine.setLength( 0 );

        int count = 0;

        for( int i = 0; i < size; ++i ){
            char b = (char) ( data[i] & 0xff );

            if( b < 0x10 ){
                hexLine.append( '0' );
            }

            hexLine.append(Integer.toHexString(b));
            hexLine.append(' ');

            if ((b >= 32 && b <= 127) || Character.isDigit(b) ||
                    Character.isLowerCase(b) || Character.isUpperCase(b)) {
                charLine.append(b);
            } else {
                charLine.append('.');
            }

            if (++count >= maxLen || i == size - 1) {
                while (count++ < maxLen) {
                    hexLine.append(" ");
                }

                hexLine.append(' ');
                hexLine.append(charLine.toString());

                out.println(hexLine.toString());

                hexLine.setLength(0);
                charLine.setLength(0);
                count = 0;
            }
        }
    }

    protected void startApp() throws MIDletStateChangeException {

    }

    protected void pauseApp() {

    }

    protected void destroyApp(boolean b) throws MIDletStateChangeException {

    }
}
